package com.farmer.redpacket.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author tech-farmer
 * @ClassName: Websocket
 * @Description: (这里用一句话描述这个类的作用)
 * @date 2021/11/19 15:49
 */
@ServerEndpoint("/websocket/{userId}")
@Component
@Slf4j
public class Websocket {
    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //记录每个用户下多个终端的连接
    private static Map<String, Session> userSocket = new HashMap<>();

    //需要session来对用户发送数据, 获取连接特征userId
    private Session session;
    private String userId;

    /**
     * @Title: onOpen
     * @Description: websocekt连接建立时的操作
     * @param @param userId 用户id
     * @param @param session websocket连接的session属性
     * @param @throws IOException
     */
    @OnOpen
    public void onOpen(@PathParam("userId") String userId,Session session) throws IOException {
        this.session = session;
        this.userId = userId;
        userSocket.put(userId,session);
    }

    /**
     * @Title: onClose
     * @Description: 连接关闭的操作
     */
    @OnClose
    public void onClose(){
        userSocket.remove(this.userId);
    }

    /**
     * @Title: onMessage
     * @Description: 收到消息后的操作
     * @param @param message 收到的消息
     * @param @param session 该连接的session属性
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.debug("收到来自用户id为：{}的消息：{}",this.userId,message);
    }

    /**
     * @Title: onError
     * @Description: 连接发生错误时候的操作
     * @param @param session 该连接的session
     * @param @param error 发生的错误
     */
    @OnError
    public void onError(Session session, Throwable error){
        log.debug("用户id为：{}的连接发送错误",this.userId);
        error.printStackTrace();
    }

    /**
     * @Title: sendMessageToUser
     * @Description: 发送消息给用户下的所有终端
     * @param @param userId 用户id
     * @param @param message 发送的消息
     * @param @return 发送成功返回true，反则返回false
     */
    public static Boolean sendMessageToUser(String userId,String message){
        for (Map.Entry<String, Session> entry : userSocket.entrySet()) {
            if(!entry.getKey().equals(userId)){
                try {
                    entry.getValue().getBasicRemote().sendText(message);
                } catch (IOException e) {
                }
            }
        }
        log.debug("发送错误：当前连接不包含id为：{}的用户",userId);
        return false;
    }
}
